package com.ioc.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;

/**
 * jdk动态代理：目标对象一定要实现接口，否则无法使用jdk动态代理
 * 功能：通过jdk动态代理可以为所有的目标类生成代理对象，并且对目标对象进行增强
 */
public class JdkDynamicProxy {

    //目标对象
    private Object target;

    public JdkDynamicProxy() {
    }

    public JdkDynamicProxy(Object target) {
        this.target = target;
    }

    public void before(){
        System.out.println("执行前:"+new Date().toLocaleString());
    }

    public void after(){
        System.out.println("执行后："+new Date().toString());
    }


    //生成代理对象-最后通过返回的代理对象，调用目标对象的方法，同时还去方法进行增强
    //自定义方法，方法名随意
    public Object getProxyObject(){

        /**
         * 使用jdk提供好的方法，生成代理对象
         * 第一个参数：目标对象的类加载器
         * 第二个参数：目标对象的所有接口
         * 第三个参数：对目标对象进行怎样的增强--使用匿名内部类
         */
        Object newProxyInstance = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),
                new InvocationHandler() {
                    //在这个方法中写增强的业务
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        before();
                        //调用目标方法
                        Object invoke = method.invoke(target, args);

                        after();
                        return invoke;
                    }
                });
        return newProxyInstance;
    }


}
